/*
package com.malie.myspringboot.developmentManual;

import javafx.util.Pair;

import java.util.*;
import java.util.stream.Collectors;

public class DevelopmentManual {


    public static void main(String[] args) {

        */
/**
 * 判断所有集合内部的元素是否为空，使用 isEmpty()方法，而不是 size()==0 的方式。
 * 说明：前者的时间复杂度为 O(1)，而且可读性更好。
 * <p>
 * 在使用 java.util.stream.Collectors 类的 toMap()方法转为 Map 集合时，一定要使
 * 用含有参数类型为 BinaryOperator，参数名为 mergeFunction 的方法，否则当出现相同 key
 * 值时会抛出 IllegalStateException 异常。
 * 说明：参数 mergeFunction 的作用是当出现 key 重复时，自定义对 value 的处理策略。
 * <p>
 * 在使用 java.util.stream.Collectors 类的 toMap()方法转为 Map 集合时，一定要注
 * 意当 value 为 null 时会抛 NPE 异常。
 * 说明：在 java.util.HashMap 的 merge 方法里会进行如下的判断：
 * if (value == null || remappingFunction == null)
 * throw new NullPointerException();
 * <p>
 * 使用 Map 的方法 keySet()/values()/entrySet()返回集合对象时，不可以对其进行添
 * 加元素操作，否则会抛出 UnsupportedOperationException 异常。
 * <p>
 * 使用集合转数组的方法，必须使用集合的 toArray(T[] array)，传入的是类型完全一
 * 致、长度为 0 的空数组。
 * 反例：直接使用 toArray 无参方法存在问题，此方法返回值只能是 Object[]类，若强转其它类型数组将出现
 * ClassCastException 错误。
 * 说明：使用 toArray 带参方法，数组空间大小的 length，
 * 1） 等于 0，动态创建与 size 相同的数组，性能最好。
 * 2） 大于 0 但小于 size，重新创建大小等于 size 的数组，增加 GC 负担。
 * 3） 等于 size，在高并发情况下，数组创建完成之后，size 正在变大的情况下，负面影响与 2 相同。
 * 4） 大于 size，空间浪费，且在 size 处插入 null 值，存在 NPE 隐患。
 * <p>
 * 使用工具类 Arrays.asList()把数组转换成集合时，不能使用其修改集合相关的方法，
 * 它的 add/remove/clear 方法会抛出 UnsupportedOperationException 异常。
 * 说明：asList 的返回对象是一个 Arrays 内部类，并没有实现集合的修改方法。Arrays.asList 体现的是适配
 * 器模式，只是转换接口，后台的数据仍是数组。
 * <p>
 * 不要在 foreach 循环里进行元素的 remove/add 操作。remove 元素请使用 Iterator
 * 方式，如果并发操作，需要对 Iterator 对象加锁。
 * <p>
 * 集合初始化时，指定集合初始值大小。
 * 说明：HashMap 使用 HashMap(int initialCapacity) 初始化，如果暂时无法确定集合大小，那么指定默
 * 认值（16）即可。
 * 正例：initialCapacity = (需要存储的元素个数 / 负载因子) + 1。注意负载因子（即 loader factor）默认
 * 为 0.75，如果暂时无法确定初始值大小，请设置为 16（即默认值）。
 * 反例：HashMap 需要放置 1024 个元素，由于没有设置容量初始大小，随着元素不断增加，容量 7 次被迫
 * 扩大，resize 需要重建 hash 表。当放置的集合元素个数达千万级别时，不断扩容会严重影响性能。
 *//*

        HashMap<Object, Object> map = new HashMap<>();
        if (map.isEmpty()) {
            System.out.println("集合为空");
        }
        ArrayList<Object> list = new ArrayList<>();
        if (list.isEmpty()) {
            System.out.println("集合为空");
        }


        */
/**
 *在使用 java.util.stream.Collectors 类的 toMap()方法转为 Map 集合时，一定要使
 * 用含有参数类型为 BinaryOperator，参数名为 mergeFunction 的方法，否则当出现相同 key
 * 值时会抛出 IllegalStateException 异常。
 * 说明：参数 mergeFunction 的作用是当出现 key 重复时，自定义对 value 的处理策略。
 *//*

        List<Pair<String, Double>> list1 = new ArrayList<>();
        list1.add(new Pair<>("version", 1.11));
        list1.add(new Pair<>("version", 2.11));
        list1.add(new Pair<>("version", 3.11));
        // 生成的 map 集合中只有一个键值对
        Map<String, Double> map1 = list1.stream().collect(Collectors.toMap(Pair::getKey, Pair::getValue, (a, b) -> b));
        System.out.println(map1);


        */
/**
 * 在使用 java.util.stream.Collectors 类的 toMap()方法转为 Map 集合时，一定要注
 * 意当 value 为 null 时会抛 NPE 异常。
 * 说明：在 java.util.HashMap 的 merge 方法里会进行如下的判断：
 * if (value == null || remappingFunction == null)
 * throw new NullPointerException();
 *//*

        List<Pair<String, Double>> pairArrayList = new ArrayList<>(2);
        pairArrayList.add(new Pair<>("version1", 4.22));
        pairArrayList.add(new Pair<>("version2", null));
        */
/*Map<String, Double> map2 = pairArrayList.stream().collect(
            // 抛出 NullPointerException 异常
                Collectors.toMap(Pair::getKey, Pair::getValue, (v1, v2) -> v2));*//*



 */
/**
 *使用 Map 的方法 keySet()/values()/entrySet()返回集合对象时，不可以对其进行添
 * 加元素操作，否则会抛出 UnsupportedOperationException 异常。
 *//*

        HashMap<Object, Object> map2 = new HashMap<>(16);
        map2.put(1, "ok");
        Collection<Object> values = map2.values();
        //  values.add(2);


        */
/**
 * 使用集合转数组的方法，必须使用集合的 toArray(T[] array)，传入的是类型完全一
 * 致、长度为 0 的空数组。
 * 反例：直接使用 toArray 无参方法存在问题，此方法返回值只能是 Object[]类，若强转其它类型数组将出现
 * ClassCastException 错误。
 *  说明：使用 toArray 带参方法，数组空间大小的 length，
 *  1） 等于 0，动态创建与 size 相同的数组，性能最好。
 * 2） 大于 0 但小于 size，重新创建大小等于 size 的数组，增加 GC 负担。
 * 3） 等于 size，在高并发情况下，数组创建完成之后，size 正在变大的情况下，负面影响与 2 相同。
 * 4） 大于 size，空间浪费，且在 size 处插入 null 值，存在 NPE 隐患。
 *//*

        List<String> list2 = new ArrayList<>(2);
        list2.add("guan");
        list2.add("bao");
        String[] array = list2.toArray(new String[0]);
        // String[] array = (String[]) list2.toArray();   ClassCastException
        System.out.println(Arrays.toString(array));

        */
/**
 * 使用工具类 Arrays.asList()把数组转换成集合时，不能使用其修改集合相关的方法，
 * 它的 add/remove/clear 方法会抛出 UnsupportedOperationException 异常。
 * 说明：asList 的返回对象是一个 Arrays 内部类，并没有实现集合的修改方法。Arrays.asList 体现的是适配
 * 器模式，只是转换接口，后台的数据仍是数组。
 *//*

        String[] str = new String[]{"q", "w"};
        List<String> list3 = Arrays.asList(str);
        //  list3.add("e");


        */
/**
 * 不要在 foreach 循环里进行元素的 remove/add 操作。remove 元素请使用 Iterator
 * 方式，如果并发操作，需要对 Iterator 对象加锁。
 *//*

        List<String> list4 = new ArrayList<>();
        list4.add("1");
        list4.add("2");
        Iterator<String> iterator = list4.iterator();
        while (iterator.hasNext()) {
            String item = iterator.next();
            if (//删除元素的条件
                    false) {
                iterator.remove();
            }
        }
        // 反例：
       */
/* for (String item : list4) {
            if ("2".equals(item)) {
                list4.remove(item);
            }
        }*//*
   // java.util.ConcurrentModificationException
        list4.removeIf(e -> e.equals("2"));   //lamda优先使用
        System.out.println(list4);


        */
/**
 * 集合初始化时，指定集合初始值大小。
 * 说明：HashMap 使用 HashMap(int initialCapacity) 初始化，如果暂时无法确定集合大小，那么指定默
 * 认值（16）即可。
 * 正例：initialCapacity = (需要存储的元素个数 / 负载因子) + 1。注意负载因子（即 loader factor）默认
 * 为 0.75，如果暂时无法确定初始值大小，请设置为 16（即默认值）。
 * 反例：HashMap 需要放置 1024 个元素，由于没有设置容量初始大小，随着元素不断增加，容量 7 次被迫
 * 扩大，resize 需要重建 hash 表。当放置的集合元素个数达千万级别时，不断扩容会严重影响性能。
 *//*



    }
}
*/
